package cl.foursoft.sirvicod.dao.facade;

import java.sql.Connection;
import java.util.List;

import cl.foursoft.sirvicod.dao.implementacion.postgresql.DepartamentoDB;
import cl.foursoft.sirvicod.dao.implementacion.postgresql.PersonaDB;
import cl.foursoft.sirvicod.dao.interfaces.IDepartamento;
import cl.foursoft.sirvicod.dao.interfaces.IPersona;
import cl.foursoft.sirvicod.dao.transferObject.DepartamentoTO;
import cl.foursoft.sirvicod.dao.transferObject.PersonaTO;

public class FacadeDepartamento {
	
	public DepartamentoTO obtenerDepartamento(int numeroDepto, Connection c){
		DepartamentoTO resp = null;
		IDepartamento deptoDB = new DepartamentoDB(c);
		IPersona personaDB = new PersonaDB(c);
		
		resp = deptoDB.obtenerDepartamento(numeroDepto);
		if(resp != null){
			PersonaTO propietario = personaDB.obtenerPropietario(numeroDepto);
			if(propietario != null){
				resp.setPropietario(propietario);
				List<PersonaTO> residentes = personaDB.obtenerResidentes(numeroDepto);				
				if(residentes != null){
					resp.setResidentes(residentes);
				}
				else{
					resp = null;
				}
				
				List<PersonaTO> autorizados = personaDB.obtenerPersonasAutorizadasPorDepto(numeroDepto);
				if(autorizados != null){
					resp.setAutorizados(autorizados);
				}
				else{
					resp = null;
				}
			}
			else{
				resp = null;
			}
		}
		
		return resp;
	}
	
	public boolean existeDepartamento(int numeroDepto, Connection c){
		boolean resp = false;
		IDepartamento deptoDB = new DepartamentoDB(c);
		
		resp = deptoDB.existeDepartamento(numeroDepto);
		
		return resp;
	}
	
	public int guardarDepartamento(DepartamentoTO depto, Connection c){
		int resp = -1;
		IDepartamento deptoDB = new DepartamentoDB(c);
		FacadePersona facadePersona = new FacadePersona();
		
		//Verificando si propietario existe como Persona en el sistema
		if(facadePersona.existePersona(depto.getPropietario().getRut(), c)){
			resp = facadePersona.actualizarPersonaFull(depto.getPropietario(), c);
		}
		else{
			resp = facadePersona.guardarPersonaFull(depto.getPropietario(), c);
		}
		
		if(resp > -1){
			resp = deptoDB.guardarDepartamento(depto);
			
			if(resp > 0){
				//Guardando residentes de departamento
				for(PersonaTO residente: depto.getResidentes()){
					if(facadePersona.existePersona(residente.getRut(), c)){
						resp = facadePersona.actualizarPersonaFull(residente, c);
					}
					else{
						resp = facadePersona.guardarPersonaFull(residente, c);
					}
					
					if(resp > -1){
						resp = facadePersona.guardarResidente(residente, depto.getNumeroDepto(), c);
						if(resp <= 0)
							return resp;
					}
					else{
						return resp;
					}
				}
				
				//Guardando visitas autorizadas de departamento
				for(PersonaTO autorizado: depto.getAutorizados()){
					if(facadePersona.existePersona(autorizado.getRut(), c)){
						resp = facadePersona.actualizarPersonaFull(autorizado, c);
					}
					else{
						resp = facadePersona.guardarPersonaFull(autorizado, c);
					}
					
					if(resp > -1){
						resp = facadePersona.guardarPersonaAutorizada(autorizado, depto.getNumeroDepto(), c);
						if(resp <= 0)
							return resp;
					}
					else{
						return resp;
					}
				}
			}
		}
		
		return resp;
	}
	
	public int actualizarDepartamento(DepartamentoTO depto, Connection c){
		int resp = -1;
		IDepartamento deptoDB = new DepartamentoDB(c);
		FacadePersona facadePersona = new FacadePersona();
		
		//Verificando si propietario existe como Persona en el sistema
		if(facadePersona.existePersona(depto.getPropietario().getRut(), c)){
			resp = facadePersona.actualizarPersonaFull(depto.getPropietario(), c);
		}
		else{
			resp = facadePersona.guardarPersonaFull(depto.getPropietario(), c);
		}
		
		if(resp > -1){
			resp = deptoDB.actualizarDepartamento(depto);
			
			if(resp > 0){
				//Eliminando residentes de departamento
				resp = facadePersona.eliminarResidentes(depto.getNumeroDepto(), c);
				if(resp < 0)
					return resp;
				
				//Guardando residentes de departamento
				for(PersonaTO residente: depto.getResidentes()){
					if(facadePersona.existePersona(residente.getRut(), c)){
						resp = facadePersona.actualizarPersonaFull(residente, c);
					}
					else{
						resp = facadePersona.guardarPersonaFull(residente, c);
					}
					
					if(resp > -1){
						resp = facadePersona.guardarResidente(residente, depto.getNumeroDepto(), c);
						if(resp <= 0)
							return resp;
					}
					else{
						return resp;
					}
				}
				
				//Eliminando visitas autorizadas de departamento
				resp = facadePersona.eliminarPersonasAutorizadas(depto.getNumeroDepto(), c);
				if(resp < 0)
					return resp;
				
				//Guardando visitas autorizadas de departamento
				for(PersonaTO autorizado: depto.getAutorizados()){
					if(facadePersona.existePersona(autorizado.getRut(), c)){
						resp = facadePersona.actualizarPersonaFull(autorizado, c);
					}
					else{
						resp = facadePersona.guardarPersonaFull(autorizado, c);
					}
					
					if(resp > -1){
						resp = facadePersona.guardarPersonaAutorizada(autorizado, depto.getNumeroDepto(), c);
						if(resp <= 0)
							return resp;
					}
					else{
						return resp;
					}
				}
			}
		}
		
		return resp;
	}
}
